package org.pupil.queue;

/**
 * @Description: 循环队列
 * @Author: pupil
 * @Date: 2024/08/04 下午 1:26
 */
public class CircularQueue {
    private int[] queue;
    private int l, r, size, limit;

    // 同时在队列里的数字个数，不要超过n
    public CircularQueue(int n) {
        queue = new int[n];
        l = r = size = 0;
        limit = n;
    }


    // 判断队列是否为空
    public boolean isEmpty() {
        return size == 0;
    }

    // 判断队列是否为满
    public boolean isFull() {
        return size == limit;
    }

    // 入队
    // 如果队列满了，什么也不做，返回false
    // 如果队列没满，加入value，返回true
    public boolean enQueue(int num) {
        if (isFull()) {
            return false;
        } else {
            queue[r] = num;
            r = r == limit - 1 ? 0 : r + 1;
            size++;
            return true;
        }
    }

    // 出队
    // 如果队列空了，什么也不做，返回false
    // 如果队列没空，弹出头部的数字，返回true
    public boolean deQueue() {
        if (isEmpty()) {
            return false;
        } else {
            l = l == limit - 1 ? 0 : l + 1;
            size--;
            return true;
        }
    }

    // 返回队列头部的数字(不弹出)，如果没有数，返回-1
    public int Front() {
        if (isEmpty()) {
            return -1;
        } else {
            return queue[l];
        }
    }

    // 返回队列尾部的数字(不弹出)，如果没有数，返回-1
    public int Rear() {
        if (isEmpty()) {
            return -1;
        } else {
            int last = r == 0 ? (limit - 1) : (r - 1);
            return queue[last];
        }
    }

    // 获取长度
    public int size(){
        return size;
    }

}
